//go:build !windows
// +build !windows

package main

import (
	"net"
	"syscall"
)

// 设置TCP接收缓冲区大小 - Unix/Linux/macOS实现
// 通过设置SO_RCVBUF套接字选项控制TCP接收窗口大小
// 从而影响发送方的发送速率，实现内核层限速
func setSocketRecvBuffer(conn *net.TCPConn, size int) error {
	// 获取TCP连接的底层文件描述符
	rawConn, err := conn.SyscallConn()
	if err != nil {
		return err
	}

	var syscallErr error
	// 在连接的文件描述符上执行控制操作
	controlErr := rawConn.Control(func(fd uintptr) {
		// 使用系统调用设置套接字选项
		// int(fd): 文件描述符
		// syscall.SOL_SOCKET: 套接字级别
		// syscall.SO_RCVBUF: 接收缓冲区大小选项
		// size: 缓冲区大小值
		syscallErr = syscall.SetsockoptInt(
			int(fd),
			syscall.SOL_SOCKET,
			syscall.SO_RCVBUF,
			size,
		)
	})

	if controlErr != nil {
		return controlErr
	}
	return syscallErr
}
